package com.johnny.xia.util.file;

import com.feilong.core.Validator;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

import java.io.FileOutputStream;
import java.io.IOException;

public class PdfUtil {

    private static Font headfont;// 设置字体大小
    private static Font keyfont;// 设置字体大小
    private static Font textfont;// 设置字体大小

    private static final String FILE_DIR = "d:/pdf/";

    static {
        BaseFont bfChinese;
        try {
            //bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
            bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            headfont = new Font(bfChinese, 10, Font.BOLD);// 设置字体大小
            keyfont = new Font(bfChinese, 8, Font.BOLD);// 设置字体大小
            textfont = new Font(bfChinese, 14, Font.NORMAL);// 设置字体大小
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {

        String timeTmp = String.valueOf(System.currentTimeMillis());
        String pdfFilePath = FILE_DIR + "createSamplePDF_" + timeTmp + ".pdf";
        //页面大小
        Rectangle rect = new Rectangle(PageSize.A4);
        //页面背景色
//        rect.setBackgroundColor(BaseColor.ORANGE);
        //Step 1—Create a Document.
        Document document = new Document(rect);

        //文档属性 start
        document.addTitle("Title@sample");
        document.addAuthor("Author@rensanning");
        document.addSubject("Subject@iText sample");
        document.addKeywords("Keywords@iText");
        document.addCreator("Creator@iText");
        //文档属性 start

        //Step 2—Get a PdfWriter instance.
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));
        //PDF版本(默认1.4)
        writer.setPdfVersion(PdfWriter.PDF_VERSION_1_7);

        /** 设置密码为：start */
//        writer.setEncryption(String.valueOf(System.currentTimeMillis()).getBytes(), (timeTmp.substring(timeTmp.length() - 6)).getBytes(),
//                PdfWriter.ALLOW_SCREENREADERS,
//                PdfWriter.STANDARD_ENCRYPTION_128);
        /** 设置密码为：end */
        //Step 3—Open the Document.
        document.open();
        // 创建第一页（如果只有一页的话，这一步可以省略）
        document.newPage();

        //设置基础属性
        setPdfBaseProperties(document, "johnny xia", "johnny xia", "johnny pdf test", "johnny的测试pdf", "johnny test subject");

        //设置图片水印,公章使用
        setImage(writer,rect);

        //设置文字水印
        setPdfContentByte(writer, rect, "johnny xia test", 2, 0.4F, 60);

        //Step 4—Add content.
        document.add(new Paragraph("甲方:______________________",textfont));
        document.add(new Paragraph("乙方:______________________",textfont));


        document.newPage();
        document.add(new Paragraph("hello word222"));
        //Step 5—Close the Document.
        document.close();

    }


    /**
     * 设置pdf基础属性
     *
     * @param document 文档对象
     * @param author   作者
     * @param creator  创建者
     * @param keyword  关键字
     * @param title    标题
     * @param subject  主题
     */
    private static void setPdfBaseProperties(Document document, String author, String creator, String keyword, String title, String subject) {
        //设置作者
        document.addAuthor(author);
        //设置创建日期
        document.addCreationDate();
        // 设置创建者
        document.addCreator(creator);
        // 设置生产者
        document.addProducer();
        // 设置关键字
        document.addKeywords(keyword);
        //设置标题
        document.addTitle(title);
        //设置主题
        document.addSubject(subject);
    }

    /**
     * @param writer      PdfWriter 对象
     * @param rect        页面大小
     * @param content     水印内容
     * @param count       水印数量
     * @param fillOpacity 字体不透明度
     * @param fontSize    字体大小
     */
    private static void setPdfContentByte(PdfWriter writer, Rectangle rect, String content, int count, float fillOpacity, int fontSize) {
        if (count < 1 || writer == null || rect == null || Validator.isNullOrEmpty(content)) {
            return;
        }
        // 加入水印
        PdfContentByte waterMar = writer.getDirectContentUnder();
        // 开始设置水印
        waterMar.beginText();
        // 设置水印透明度
        PdfGState gs = new PdfGState();
        // 设置填充字体不透明度为0.4f
        gs.setFillOpacity(fillOpacity);
        try {
            // 设置水印字体参数及大小 (字体参数，字体编码格式，是否将字体信息嵌入到pdf中（一般不需要嵌入），字体大小)
            waterMar.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), fontSize);
            // 设置透明度
            waterMar.setGState(gs);
            for (int i = 1; i <= count; i++) {
                // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
                waterMar.showTextAligned(Element.ALIGN_RIGHT, content, rect.getWidth() / i, rect.getHeight() / i - 100, 45);
            }
            // 设置水印颜色
            waterMar.setColorFill(BaseColor.GRAY);
            //结束设置
            waterMar.endText();
            waterMar.stroke();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            waterMar = null;
            gs = null;
        }
    }

    private static void setImage(PdfWriter writer,Rectangle rect){// 加入水印
        PdfContentByte waterMar = writer.getDirectContentUnder();
        // 开始设置水印
        waterMar.beginText();
        // 设置水印透明度
        PdfGState gs = new PdfGState();
        // 设置笔触字体不透明度为0.4f
        gs.setStrokeOpacity(1F);
        try {
            Image image = Image.getInstance("d:/gz.jpg");

            System.out.println(rect.getWidth()+"-->"+rect.getHeight());

            // 设置坐标 绝对位置 X Y
            image.setAbsolutePosition(rect.getWidth()-100, rect.getHeight()-100);
            image.setAbsolutePosition(200,300);
            // 设置旋转弧度
//            image.setRotation(30);// 旋转 弧度
            // 设置旋转角度
//            image.setRotationDegrees(45);// 旋转 角度
            // 设置等比缩放
            image.scalePercent(50);// 依照比例缩放
            // image.scaleAbsolute(200,100);//自定义大小
            // 设置透明度
            waterMar.setGState(gs);
            // 添加水印图片
            waterMar.addImage(image);
            // 设置透明度
            waterMar.setGState(gs);
            //结束设置
            waterMar.endText();
            waterMar.stroke();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            waterMar = null;
            gs = null;
        }

    }
}
